package com.heima.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.article.dto.ArticleDto;
import com.heima.article.dto.ArticleHomeDto;
import com.heima.article.pojo.Article;
import com.heima.common.constant.ArticleConstants;
import com.heima.mapper.ArticleMapper;
import com.heima.common.dtos.ResponseResult;
import com.heima.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
@Slf4j
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {

    /**
     * 根据参数加载文章列表
     *
     * @param loadType 1为加载更多  2为加载最新
     * @param dto
     * @return
     */

    @Autowired
    private ArticleMapper articleMapper;

    @Override
    public ResponseResult load(Short loadType, ArticleHomeDto dto) {

        //作参数校验
        //size校验
        Integer size = dto.getSize();
        if (size == null || size == 0) {
            size = 10;
            dto.setSize(size);
        }

        //size大小规范，意思就是两个参数取小的那个，size不大于MAX_PAGE_SIZE
        size = Math.min(size, ArticleConstants.MAX_PAGE_SIZE);
        dto.setSize(size);

        //type规范，将未知loadType规范为LOADTYPE_LOAD_MORE
        if (!loadType.equals(ArticleConstants.LOADTYPE_LOAD_MORE) && !loadType.equals(ArticleConstants.LOADTYPE_LOAD_NEW)) {
            loadType = ArticleConstants.LOADTYPE_LOAD_MORE;
        }

        //时间校验
        if (dto.getMaxBehotTime() == null) {
            dto.setMaxBehotTime(new Date());
        }
        if (dto.getMinBehotTime() == null) {
            dto.setMinBehotTime(new Date());
        }

        List<Article> articles = articleMapper.loadArticleList(dto, loadType);

        return ResponseResult.okResult(articles);
    }


    /**
     * 当自媒体文章审核通过时，通过Feign调用当前方法将文章存进数据库
     *
     * @return
     */
    public Long saveNews(ArticleDto dto) {

//        try {
//            Thread.sleep(3000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        Article article = new Article();
        //属性拷贝
        CopyOptions options = CopyOptions.create()
                .setIgnoreNullValue(true)  // 忽略源对象属性为空的情况
                .setIgnoreError(true)
                .setIgnoreProperties("id");     // 忽略复制过程中出现的错误
        BeanUtil.copyProperties(dto, article, options);

        if (dto.getId() == null) {
            log.info("将文章存进Article表");
            //保存操作
            save(article);
            return article.getId();
        } else {
            log.info("将文章修改进Article表");
            //修改操作
            article.setId(dto.getId());
            updateById(article);
            return article.getId();
        }

    }
}
